package com.game.dao.user.roles;

import com.coment.po.roles.Roles;
import com.xs.action.exection.ActionException;
import org.springframework.data.mongodb.repository.Aggregation;
import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.lang.NonNull;

import javax.validation.constraints.NotNull;
import java.util.List;
import java.util.Optional;

public interface RolesDao extends MongoRepository<Roles, String> {
    Roles searchByUserInfoIdAndCardId(Integer userInfoId, Integer cardId);

    /// 获取用户所有角色
    List<Roles> searchAllByUserInfoId(Integer userInfoId);

    /// 直接查询用户所有角色的卡片ID（使用聚合）
    @Aggregation(pipeline = {
            "{ $match: { 'userInfoId': ?0 } }",
            "{ $project: { 'cardId': 1, '_id': 0 } }"
    })
    List<Integer> findCardIdsByUserInfoId(Integer userInfoId);

    /// 获取角色
    default Roles findByIdMust(@NotNull String id) {
        return this.findById(id).orElseThrow(() -> new ActionException("角色不存在" + id));
    }

    /// 用户是否存在角色
    /// 自动注解 @Exists(query  = "{ 'userInfoId': ?0 }")
    boolean existsByUserInfoId(@NotNull Integer userInfoId);

    @NonNull
    @Override
    <S extends Roles> S save(@NonNull S entity);


    @NonNull
    @Override
    Optional<Roles> findById(@NonNull String id);

    void removeById(String id);

    boolean existsByUserInfoIdAndCardId(Integer userInfoId, Integer cardId);

    /// 返回玩家拥有的所有角色id
    @Aggregation(pipeline = {
            "{ $match: { 'userInfoId': ?0 } }",
            "{ $project: { '_id': 1 } }"
    })
    List<String> findRoleIdsByUserInfoId(Integer userInfoId);
}
